/**
 * 错误处理工具
 * 统一管理应用中的错误处理逻辑
 */

import { HTTP_STATUS } from '../constants/api';

/**
 * 错误类型枚举
 */
export const ERROR_TYPES = {
  NETWORK: 'NETWORK_ERROR',
  API: 'API_ERROR',
  VALIDATION: 'VALIDATION_ERROR',
  UPLOAD: 'UPLOAD_ERROR',
  AI_SERVICE: 'AI_SERVICE_ERROR'
};

/**
 * 错误消息映射
 */
const ERROR_MESSAGES = {
  [ERROR_TYPES.NETWORK]: '网络连接失败，请检查网络设置',
  [ERROR_TYPES.API]: 'API请求失败，请稍后重试',
  [ERROR_TYPES.VALIDATION]: '输入数据不符合要求',
  [ERROR_TYPES.UPLOAD]: '文件上传失败，请重试',
  [ERROR_TYPES.AI_SERVICE]: 'AI服务暂时不可用，请稍后重试'
};

/**
 * 根据HTTP状态码获取错误消息
 * @param {number} status - HTTP状态码
 * @returns {string} 错误消息
 */
export const getErrorMessageByStatus = (status) => {
  const statusMessages = {
    [HTTP_STATUS.BAD_REQUEST]: '请求参数错误',
    [HTTP_STATUS.UNAUTHORIZED]: '未授权访问',
    [HTTP_STATUS.FORBIDDEN]: '访问被禁止',
    [HTTP_STATUS.NOT_FOUND]: '请求的资源不存在',
    [HTTP_STATUS.INTERNAL_SERVER_ERROR]: '服务器内部错误'
  };
  
  return statusMessages[status] || '未知错误';
};

/**
 * 处理API错误
 * @param {Error} error - 错误对象
 * @param {string} context - 错误上下文
 * @returns {Object} 格式化的错误信息
 */
export const handleApiError = (error, context = '') => {
  console.error(`API错误 [${context}]:`, error);
  
  let errorType = ERROR_TYPES.API;
  let message = ERROR_MESSAGES[ERROR_TYPES.API];
  
  // 网络错误
  if (!navigator.onLine) {
    errorType = ERROR_TYPES.NETWORK;
    message = '网络连接已断开，请检查网络设置';
  }
  // HTTP状态码错误
  else if (error.response?.status) {
    message = getErrorMessageByStatus(error.response.status);
  }
  // 请求超时
  else if (error.code === 'ECONNABORTED') {
    message = '请求超时，请稍后重试';
  }
  // 其他网络错误
  else if (error.message?.includes('Network Error')) {
    errorType = ERROR_TYPES.NETWORK;
    message = ERROR_MESSAGES[ERROR_TYPES.NETWORK];
  }
  
  return {
    type: errorType,
    message,
    originalError: error,
    context
  };
};

/**
 * 处理文件上传错误
 * @param {Error} error - 错误对象
 * @param {File} file - 上传的文件
 * @returns {Object} 格式化的错误信息
 */
export const handleUploadError = (error, file) => {
  console.error('文件上传错误:', error, file);
  
  let message = ERROR_MESSAGES[ERROR_TYPES.UPLOAD];
  
  // 文件大小超限
  if (error.message?.includes('file size')) {
    message = '文件大小超出限制';
  }
  // 文件类型不支持
  else if (error.message?.includes('file type')) {
    message = '不支持的文件类型';
  }
  
  return {
    type: ERROR_TYPES.UPLOAD,
    message,
    originalError: error,
    file: file?.name
  };
};

/**
 * 处理表单验证错误
 * @param {Object} validationErrors - 验证错误对象
 * @returns {Object} 格式化的错误信息
 */
export const handleValidationError = (validationErrors) => {
  const errorMessages = Object.values(validationErrors).flat();
  
  return {
    type: ERROR_TYPES.VALIDATION,
    message: errorMessages.join('; '),
    originalError: validationErrors
  };
};

/**
 * 显示错误消息
 * @param {Object} errorInfo - 错误信息对象
 */
export const showErrorMessage = (errorInfo) => {
  if (window.$message) {
    window.$message.error(errorInfo.message);
  } else {
    console.error('消息组件未初始化:', errorInfo);
  }
};

/**
 * 统一错误处理函数
 * @param {Error} error - 错误对象
 * @param {string} context - 错误上下文
 * @param {boolean} showMessage - 是否显示错误消息
 */
export const handleError = (error, context = '', showMessage = true) => {
  const errorInfo = handleApiError(error, context);
  
  if (showMessage) {
    showErrorMessage(errorInfo);
  }
  
  return errorInfo;
};